package com.vvv.designpattern.dprecated.state;

import com.vvv.designpattern.constants.RedisConstants;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @author vvv
 * @date 2023-11-20 10 48
 * discription
 * DeprecatedXXXOrder 是状态模式的具体状态类：
 * 不同的状态需要创建不同的具体状态类，本业务需要创建4个具体状态类，
 * 那么如果状态越多对应的具体状态类也越多，这会导致一定的类膨胀
 * 并且这些状态类要去实现父类对应的状态转换的方法
 *
 * DeprecatedXXXOrder 也是观察者模式的具体被观察角色
 */
@Component
public class DeprecatedSendOrder extends DeprecatedAbstractOrderState{
    @Resource
    private RedisTemplate redisTemplate;

    @Override
    protected DeprecatedOrder sendOrder(String orderId) {
        // 1. 根据orderId去redis中获取订单数据
        String key = RedisConstants.ORDER_STATE_KEY_PREFIX + orderId;
        DeprecatedOrder order = (DeprecatedOrder) redisTemplate.opsForValue().get(key);
        // 2. 判断redis订单的状态是否为ORDER_WAIT_SEND，不是则报错
        if (order == null) {
            throw new UnsupportedOperationException("the order is not exists! ");
        }
        if (!ORDER_WAIT_SEND.equals(order.getState())) {
            throw new UnsupportedOperationException("Order state should be ORDER_WAIT_SEND" +
                    ". But now it's : " + order.getState());
        }
        // 3. 修改状态为 ORDER_WAIT_SEND --> ORDER_WAIT_RECEIVE
        order.setState(ORDER_WAIT_RECEIVE);
        // 4. 写入reids
        redisTemplate.opsForValue().set(key, order);
        // 5. 观察者模式：发送发货Event
        super.notifyObserver(orderId, ORDER_WAIT_RECEIVE);
        // 6. 返回
        return order;
    }
}
